package sword.offer;

import java.util.Stack;

/**
 * 输入两个整数序列，第一个序列表示栈的压入顺序，请判断第二个序列是否为该栈的弹出顺序。
 * 假设压入栈的所有数字均不相等。例如，序列 {1,2,3,4,5} 是某栈的压栈序列，序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列
 * 但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列
 *
 * 链接：https://leetcode-cn.com/problems/zhan-de-ya-ru-dan-chu-xu-lie-lcof
 * @author 胡宇轩
 * @Email: yuxuan.hu01@bianlifeng.com
 */
public class ThirtyOne {
    public static void main(String[] args) {
        Solution solution = new Solution();
        solution.validateStackSequences(new int[]{1,2,3,4,5}, new int[]{4,5,3,1,2});
    }
    static class Solution {
        public boolean validateStackSequences(int[] pushed, int[] popped) {
            int popIndex = 0;
            int pushedIndex = 0;
            Stack<Integer> stack = new Stack<>();
            while(pushedIndex < pushed.length && popIndex < popped.length){
                if(stack.isEmpty()){
                    stack.push(pushed[pushedIndex]);
                }
                if(stack.peek() == popped[popIndex]){
                    stack.pop();
                    popIndex++;
                }else {
                    pushedIndex++;
                    if(pushedIndex < pushed.length){
                        stack.push(pushed[pushedIndex]);
                    }
                }
            }
            return popIndex == popped.length;
        }
    }
}
